招聘全面启动,你找到适合自己的工作了吗?
本文作者:周一鸣 中南财经政法大学金融学院
本文编辑:董高飞
技术总编:金点
Stata and Python 数据分析
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~引言
为成功爬取招聘信息,我们首先搜索智联招聘网,填写自己的基础信息进行注册从而登入智联招聘网,再点击“找工作”,最后会看到如下界面。
接着我们找到该界面的网页源代码对应的真实网址,如下。
由于职位很多,一页中只有30个职位,总共有34页,仔细观察其链接的特征,发现第一页对应的是pageindex=1,而第n页对应的是pageindex=n。因此可以构造出url。
url = "https://xiaoyuan.zhaopin.com/api/sou?S_SOU_FULL_INDEX=&S_SOU_POSITION_SOURCE_TYPE=&pageIndex="+str(i+1)+"&S_SOU_POSITION_TYPE=2&S_SOU_WORK_CITY=&S_SOU_JD_INDUSTRY_LEVEL=&S_SOU_COMPANY_TYPE=&S_SOU_REFRESH_DATE=&order=12&pageSize=30&_v=0.70646566&at=885417961e8d4d29b946afac6d72e264&rt=fe44b797f04f40bd8bf2c2d62191f883&x-zp-page-request-id=1216fd2d18034d77934aab22fa40a3e9-1691149616608-478458&x-zp-client-id=6d61443c-9c0e-4795-8f4a-fbf3e3db37da"
获取真实网址之后,由于每一页包含的内容格式一致,因此以第一页为例,之后用for函数进行循环即可。
本文通过BeautifulSoup对第一页的url进行解析,代码如下:
import pandas as pd
import requests
import re
from bs4 import BeautifulSoup
url = 'https://xiaoyuan.zhaopin.com/api/sou?S_SOU_FULL_INDEX=&S_SOU_POSITION_SOURCE_TYPE=&pageIndex=1&S_SOU_POSITION_TYPE=2&S_SOU_WORK_CITY=&S_SOU_JD_INDUSTRY_LEVEL=&S_SOU_COMPANY_TYPE=&S_SOU_REFRESH_DATE=&order=12&pageSize=30&_v=0.70646566&at=885417961e8d4d29b946afac6d72e264&rt=fe44b797f04f40bd8bf2c2d62191f883&x-zp-page-request-id=1216fd2d18034d77934aab22fa40a3e9-1691149616608-478458&x-zp-client-id=6d61443c-9c0e-4795-8f4a-fbf3e3db37da'
html = requests.get(url)
te = html.text
bf = BeautifulSoup(te)
输出的结果为:
仔细观察list中的内容,可以发现每个工作都由{}进行了分组,其中均是由"abroadFlag"开头,以"workingExp"结尾。因此,为将各个工作分开,以一个工作包含的所有信息为一个单位进行爬虫,我们继续利用正则表达式进行如下处理:
alllists = re.findall(r"{\"abroadFlag\":2,(.*?)\"workingExp\":\".*?\"}",str(list))
从输出结果来看,成功将所有工作分开。
接着我们需要将每份工作中需要的信息包括发布时间, 工作名称, 行业名称, 公司名称, 公司网页,工作城市, 工作性质, 薪水, 工作内容, 所需教育背景, 招聘人数, 申请方式, 申请网址等提取出来。操作如下:
jobname = re.findall(r"\"name\":\"([\u4e00-\u9fa5]+.*?)\"",alllists[30])
orgName = re.findall(r"\"orgName\":\"(.+?)\"",alllists[30])
companyUrl = re.findall(r"\"companyUrl\":\"(.+?)\"",alllists[30])
workCity = re.findall(r"\"workCity\":\"(.+?)\"",alllists[30]) workType = re.findall(r"\"workType\":\"(.+?)\"",alllists[30])
publishTime = re.findall(r"\"publishTime\":\"(.+?)\"",alllists[30])
recruitNumber = re.findall(r"\"recruitNumber\":(.+?)",alllists[30])
industryName = re.findall(r"\"industryName\":\"([\u4e00-\u9fa5,/]+)\"",alllists[30])
education = re.findall(r"\"education\":\"(.+?)\"",alllists[30])
positionUrl = re.findall(r"\"positionUrl\":\"(.+?)\"",alllists[30])
typeName = re.findall(r"\"typeName\":\"(.+?)\"",alllists[30])
jobSummary = re.findall(r"\"jobSummary\":\"(.+?)\"",alllists[30])
salary60 = re.findall(r"\"salary60\":\"(.+?)\"",alllists[30])
if recruitNumber == ['0']:
recruitNumber = ['若干']
最后,我们用for进行循环并构建Excel,将所有数据写入Excel中,具体代码如下:
import numpy as np
import pandas as pd
import xlwt
import re
import xlrd
import xlwt
from xlutils.copy import copy
import requests
from bs4 import BeautifulSoup
def write_excel_xls(path, sheet_name, value):
index = len(value) # 获取需要写入数据的行数
workbook = xlwt.Workbook() # 新建一个工作簿
sheet = workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格
for i in range(0, index):
for j in range(0, len(value[i])):
sheet.write(i, j, value[i][j]) # 像表格中写入数据(对应的行和列)
workbook.save(path) # 保存工作簿
def write_excel_xls_append(path, value):
index = len(value) # 获取需要写入数据的行数
workbook = xlrd.open_workbook(path) # 打开工作簿
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
rows_old = worksheet.nrows # 获取表格中已存在的数据的行数
new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格
for i in range(0, index):
for j in range(0, len(value[i])):
new_worksheet.write(i + rows_old, j, value[i][j]) # 追加写入数据,注意是从i+rows_old行开始写入
new_workbook.save(path) # 保存工作簿
def read_excel_xls(path):
workbook = xlrd.open_workbook(path) # 打开工作簿
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
for i in range(0, worksheet.nrows):
for j in range(0, worksheet.ncols):
print(worksheet.cell_value(i, j), "\t", end="") # 逐行逐列读取数据
print()
titlelist = [[["publishTime"], ["jobname"], ["industryName"], ["orgName"], ["companyUrl"], ["workCity"], ["workType"], ["salary60"], ["jobSummary"], ["education"], ["positionOfNlp"], ["typeName"], ["positionUrl"]]]
valuelist = []
for i in range(34):
url = "https://xiaoyuan.zhaopin.com/api/sou?S_SOU_FULL_INDEX=&S_SOU_POSITION_SOURCE_TYPE=&pageIndex=" + str(
i + 1) + "&S_SOU_POSITION_TYPE=2&S_SOU_WORK_CITY=&S_SOU_JD_INDUSTRY_LEVEL=&S_SOU_COMPANY_TYPE=&S_SOU_REFRESH_DATE=&order=12&pageSize=30&_v=0.70646566&at=885417961e8d4d29b946afac6d72e264&rt=fe44b797f04f40bd8bf2c2d62191f883&x-zp-page-request-id=1216fd2d18034d77934aab22fa40a3e9-1691149616608-478458&x-zp-client-id=6d61443c-9c0e-4795-8f4a-fbf3e3db37da"
html = requests.get(url)
te = html.text
bf = BeautifulSoup(te)
list = re.findall(r"\"list\":\[(.+)\]", str(bf))
alllists = re.findall(r"{\"abroadFlag\":2,(.*?)\"workingExp\":\".*?\"}", str(list))
for i in range(len(alllists)):
jobname = re.findall(r"\"name\":\"([\u4e00-\u9fa5]+.*?)\"", alllists[i])
orgName = re.findall(r"\"orgName\":\"(.+?)\"", alllists[i])
companyUrl = re.findall(r"\"companyUrl\":\"(.+?)\"", alllists[i])
workCity = re.findall(r"\"workCity\":\"(.+?)\"", alllists[i])
workType = re.findall(r"\"workType\":\"(.+?)\"", alllists[i])
publishTime = re.findall(r"\"publishTime\":\"(.+?)\"", alllists[i])
recruitNumber = re.findall(r"\"recruitNumber\":(.+?)", alllists[i])
industryName = re.findall(r"\"industryName\":\"([\u4e00-\u9fa5,/]+)\"", alllists[i])
education = re.findall(r"\"education\":\"(.+?)\"", alllists[i])
positionUrl = re.findall(r"\"positionUrl\":\"(.+?)\"", alllists[i])
typeName = re.findall(r"\"typeName\":\"(.+?)\"", alllists[i])
jobSummary = re.findall(r"\"jobSummary\":\"(.+?)\"", alllists[i])
salary60 = re.findall(r"\"salary60\":\"(.+?)\"", alllists[i])
if recruitNumber == ['0']:
recruitNumber = ['若干']
jobAttributes = [publishTime, jobname, orgName, industryName, companyUrl, workCity, workType, salary60,
jobSummary, education, recruitNumber, typeName, positionUrl]
value = []
for item in jobAttributes:
keyValue = str(item)
value.append(keyValue)
valuelist.append(value)
book_name_xls = './xls格式招聘信息工作簿.xls'
sheet_name_xls = 'xls格式招聘信息表'
write_excel_xls(book_name_xls, sheet_name_xls, titlelist)
write_excel_xls_append(book_name_xls, valuelist)
其输出的Excel表格如下,完整的内容在Excel工作簿中呈现:
招聘信息就爬取完成啦,在此小编祝愿所有毕业生们都能找到心仪的工作!
END
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐“狗大户”疯狂投币!中东基金加速布局A股【python可视化】立秋!酷热天气就此结束?全国各地高温地图一探究竟Python爬取暑期票房排行
给文件搬家——copy&XCOPY
NLTK,全面的Python基础NLP库
爬取A股上市公司指定年份年报
机器学习——监督学习入门禁忌魔法解封,击穿专业壁垒:ChatGPT code interpreter暑期来啦~⼀起看⼀看近期的天⽓情况【命令重磅更新】在Stata中深入使用ChatGPT
爬虫俱乐部2023第一期编程训练营开始报名啦!
【爬虫基础】Scrapy爬虫框架迈向交互式编程,ChatGPT更新!一个简单又好玩的Python库——MyQR
replace命令的“加强版”!——如何使用ereplace,结合egen
XML 轻松读取:用 Python 发现数据宝藏
爬虫俱乐部重磅推出cnstata.com.cn
Markdown:让数学公式输入更方便!
处理日期的好手:pendulum微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。